home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d2 / optima.arc / OPTIM.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-01-18  |  23.3 KB  |  1,166 lines

  1. NAME    OPTIM
  2. .XLIST
  3. PAGE 105,132
  4. TITLE    Fixed Disk Optimising Program
  5. .LIST
  6. COMMENT *
  7.     Uses High resolution Timer routine to check speed of processes.
  8.     *
  9.  
  10. ;---------------------
  11. ; MACROS
  12. ;---------------------
  13.  
  14. DISPLAY    MACRO            ; Display String @ DS:DX
  15.     MOV    AH,9
  16.     INT    21H
  17.     ENDM
  18.     
  19. HEADSET    MACRO     
  20.     MOV    DL,CS:[DR_ID]
  21.     MOV    DH,0
  22.     MOV    CX,01H
  23.     MOV    AX,21AH
  24.     MOV    BX,OFFSET DTABUF
  25.     INT    13H
  26.     ENDM
  27.  
  28. ;------------------    
  29. ;    EQUATES
  30. ;------------------
  31.  
  32. TIM_LOW        EQU    006CH    ; Location of System Clock
  33. BIOS_DSEG    EQU    0040H    ; Address of BIOS Data segment
  34. TIM_MODE    EQU    43H    ; Control Port Address of 8253-5 chip
  35. TIM_0        EQU    40H    ; Read Port Address of 8253-5
  36.  
  37. ;------------------
  38. ;    CODE
  39. ;------------------
  40.  
  41.     ASSUME    CS:CODE, DS:CODE
  42. CODE    SEGMENT
  43. MAIN    PROC    NEAR
  44.     ORG    100H
  45.     
  46. BEGIN:    JMP    START
  47.  
  48. COUNT        DW    0    ; Interrupt Ticks  54.925 msecs
  49. COUNT_MICRO    DW    0    ; Calculate from COUNT
  50. COUNT_MILLI    DW    0    ; Calculate from COUNT
  51. TIM_MICRO    DW    0    ; From 8253 counter
  52. TIM_MILLI    DW    0    ; Final Value
  53. TIM_SEC        DW    0    ; Final Value
  54.  
  55. TIM1MIC        DW    0    ; Test 1 Microseconds
  56. TIM1MIL        DW    0    ; Test 1 Milliseconds
  57. TIM1SEC        DW    0    ; Test 1 Seconds
  58.  
  59. TIM2MIC        DW    0    ; Test 2 Microseconds
  60. TIM2MIL        DW    0    ; Test 2 Milliseconds
  61. TIM2SEC        DW    0    ; Test 2 Seconds
  62.  
  63. TIM3MIC        DW    0    ; Test 3 Microseconds
  64. TIM3MIL        DW    0    ; Test 3 Milliseconds
  65. TIM3SEC        DW    0    ; Test 3 Seconds
  66.  
  67. TIM4MIC        DW    0    ; Test 4 Microseconds
  68. TIM4MIL        DW    0    ; Test 4 Milliseconds
  69. TIM4SEC        DW    0    ; Test 4 Seconds
  70.  
  71. COUNT_MAX    DW    65535    ; Starting point
  72. ADJUSTM        DW    0    ; Compensating Factor
  73. TIM_CONV    DW    8381    ; 838.096 nsec/tick
  74. COUNT_CONV    DW    54925    ; 54.925 msec/tick
  75. TEN_TH        DW    10000    ; Divisor 1
  76. FIVE_TH        DW    5000    ; Divisor 2
  77. THOU        DW    1000    ; Divisor 3
  78. TEN        DW    10    ; Divisor 4
  79. INTERLEAVE    DB    16    ; Interleave Count
  80. INTLVE        DB    0    ; Optimum Interleave
  81. LOWMIC        DW    0FFFFH
  82. LOWMIL        DW    0FFFFH
  83. LOWSEC        DW    0FFFFH
  84. ANSYN        DB    'YYN',13
  85. ANSCD        DB    'CCD',13
  86. DR_ID        DB    80H
  87.  
  88. ;-------------------
  89. ;  Message Area
  90. ;-------------------
  91. SIGN_ON        DB    '╔══════════════════════════════════════════════════════════════════════════════╗',13
  92.         DB    '║       CUMANA - Fixed Disk Installation and Optimisation - Version 1.20       ║',13
  93.         DB    '║       ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀       ║',13
  94.         DB    '║                                                                              ║',13
  95.         DB    '║      This Program is designed to set up a Fixed Disk Unit from scratch.      ║',13
  96.         DB    '║                                                                              ║',13
  97.         DB    '║  Once you have elected to continue, the program will list the settings of    ║',13
  98.         DB    '║  the selected drive.    If you accept these settings as correct,  the        ║',13
  99.         DB    '║  program will then experimentally format  Cylinders 0 and 1 and time the     ║',13
  100.         DB    '║  access for each of 16 interleave values.  Once this process has ended,      ║',13
  101.         DB    '║  the whole disk will be formatted at the optimum interleave setting.         ║',13
  102.         DB    '║  This ensures that Fixed Disk performance will be efficiently matched to     ║',13
  103.         DB    '║  your machine.                                                               ║',13
  104.         DB    '║                                                                              ║',13
  105.         DB    '║  When formatting has been completed, you will be asked to enter details      ║',13
  106.         DB    '║  of defective areas of the disk.  These are usually written on the disk      ║',13
  107.         DB    '║  itself or the relevant documentation.  Make a note of the Cylinders and     ║',13
  108.         DB    '║  Heads involved BEFORE you run the program, so that you don',39,'t need to        ║',13
  109.         DB    '║  move the disk while it is in operation.  Cylinder numbers should be         ║',13
  110.         DB    '║  entered in decimal notation.   Upon correct completion, the program will    ║',13
  111.         DB    '║  Reboot to establish the Drive and then continue with software installation. ║',13
  112.         DB    '║                                                                              ║',13
  113.         DB    '║  Press a Key when you are ready to continue ...                              ║',13
  114.         DB    '╚══════════════════════════════════════════════════════════════════════════════╝',13,'$'
  115.  
  116. MESS_01        DB    'WARNING !!!  This program will ERASE all data on the selected drive!',13,10
  117.         DB    '║ Do you want to continue?  [N]$'
  118. MESS_AVE    DB    ' $'
  119. MESS_SEC    DB    ' Seconds$'
  120. MESS_MIL    DB    '.$'
  121. MESS_MIC    DB    ' $'
  122. MESS_RUN    DB    'Interleave '
  123. MESS_EQ        DB    '   timed at $'
  124. ASC_STR        DB    5 DUP('d'),'$'
  125. BLANKLINE    DB    '                                                                            $'
  126. LF        DB    13,10,'║ $'
  127. BELL        DB    7,'$'
  128. MESS_OPT0    DB    'Optimising Interleave - $'
  129. MESS_OPT1    DB    'Optimum Interleave is '
  130. MESS_OPT2    DB    '    ',13,10,'║ $'
  131. MESS_OPT3    DB    ' FORMATTING DRIVE '
  132. MESS_OPT4    DB    'C'
  133.         DB    '  with Interleave $'
  134. MESS_OPT5    DB    'Any Bad Tracks to Enter? [N]$'
  135. MESS_OPT6    DB    'Enter Cylinder Number (Decimal) ... $'
  136. MESS_OPT7    DB    'Enter Head Number  ................ $'
  137. MESS_OPT8    DB    'Bad Track Flagged!      Any more Bad Tracks? [N]$'
  138. MESS_OPT9    DB    'Format Completed                         ',13,10,10,'║ $'
  139. MESS_OPT10    DB    'Entering Bad Track information ... ',13,10,'$'
  140. DUFF_CONT    DB    'DISK CONTROLLER ERROR REPORTED!',13,10
  141.         DB    'Please check Controller Cables and Connections.',13,10,'$'
  142. LOG_PART    DB    'The Controller indicates that the Drive is set for LOGICAL PARTIONING ',13,10
  143.         DB    '║ This program cannot handle Logical Formatting - please us the ROM routine.',13,10,10,'$'
  144. SELECT1        DB    'Select Drive to Format (C or D) [C]$'
  145. DR_REPP        DB    'Selected Drive has these Settings ...',13,10,10
  146.         DB    '║ $'
  147. DR_CYL        DB    '      Number of CYLINDERS ... : $'
  148. DR_HDS        DB    '      Number of HEADS ....... : $'
  149. CYLS        DW    00
  150. HDS        DB    0        
  151. ABORT        DB    13,10,'║ Returning to Operating System ...',13,10,'$'
  152. CONTINUE    DB    13,10,'║ Writing Partition Table ...'
  153.         DB    13,10,'║ Rebooting to establish Drive'
  154.         DB    10,10,10,10,10,10,10,10,13,'$'
  155. CONFIRM        DB    'Are these correct? [Y]$'
  156. BADCYL        DB    13,10,'║ Invalid Cylinder Number!$'
  157. BADHD        DB    13,10,'║ Invalid Head Number!$'
  158.         DB    'Author Jim Bates - BATES Associates'
  159.     
  160.     ASSUME    CS:CODE, DS:CODE, ES:CODE
  161.  
  162. SET_BADTRAK:
  163.     MOV    DH,AL
  164.     MOV    DL,BYTE PTR CS:[DR_ID]
  165.     XCHG    BH,BL
  166.     MOV    CX,6
  167.     SHL    BL,CL
  168.     ADD    BX,1
  169.     MOV    CX,BX
  170.     MOV    AX,601H
  171.     INT    13H
  172.     RET
  173.  
  174. GETNUM:
  175.     mov    cl,30H
  176.     mov    ch,cl
  177.     mov    dx,cx
  178.     mov    bl,0
  179. GETNUM00:
  180.     mov    ah,1
  181.     int    21H
  182.     cmp    al,0DH
  183.     jnz    GETNUM01
  184.     cmp    bl,0
  185.     jnz    GETNUM07
  186.     mov    ch,2
  187.     ret    
  188.  
  189. GETNUM01:
  190.     cmp    al,8
  191.     jz    GETNUM05
  192.     inc    bl
  193.     cmp    bl,4
  194.     ja    GETNUM02
  195.     mov    dh,dl
  196.     mov    dl,ch
  197.     mov    ch,cl
  198.     mov    cl,al
  199.     jmp    GETNUM00
  200. GETNUM02:
  201.     mov    bh,0
  202. GETNUM03:
  203.     mov    dl,8
  204.     mov    ah,2
  205.     int    21H
  206.     dec    bl
  207.     cmp    bl,0
  208.     jnz    GETNUM03
  209.     cmp    bh,1
  210.     jz    GETNUM
  211. GETNUM04:
  212.     mov    dl,20H
  213.     mov    ah,2
  214.     int    21H
  215.     inc    bl
  216.     cmp    bl,4
  217.     jbe    GETNUM04
  218.     inc    bh
  219.     jmp    GETNUM03
  220. GETNUM05:
  221.     push    dx
  222.     mov    dl,20H
  223.     mov    ah,2
  224.     int    21H
  225.     cmp    bl,0
  226.     jz    GETNUM06
  227.     mov    dl,8
  228.     mov    ah,2
  229.     int    21H
  230.     pop    dx
  231.     mov    cl,ch
  232.     mov    ch,dl
  233.     mov    dl,dh
  234.     mov    dh,30      ;"0"
  235.     dec    bl
  236.     jmp    GETNUM00
  237. GETNUM06:
  238.     pop    dx
  239.     jmp    GETNUM00
  240. GETNUM07:
  241.     mov    bl,0AH
  242.     mov    al,39H
  243.     cmp    cl,al
  244.     jg    GETNUM08
  245.     cmp    ch,al
  246.     jg    GETNUM08
  247.     cmp    dl,al
  248.     jg    GETNUM08
  249.     cmp    dh,al
  250.     jg    GETNUM08
  251.     mov    al,30H
  252.     sub    cl,al
  253.     jc    GETNUM08
  254.     sub    ch,al
  255.     jc    GETNUM08
  256.     sub    dl,al
  257.     jc    GETNUM08
  258.     sub    dh,al
  259.     jc    GETNUM08
  260.     mov    al,dh
  261.     mov    ah,0
  262.     mul    bl
  263.     mov    dh,0
  264.     add    ax,dx
  265.     mul    bl
  266.     mov    dl,ch
  267.     add    ax,dx
  268.     mul    bl
  269.     mov    dl,cl
  270.     add    ax,dx
  271.     mov    ch,0
  272.     ret    
  273. GETNUM08:
  274.     mov    ch,2
  275.     ret    
  276.  
  277.  
  278. PRTDX:    PUSH    DS
  279.     MOV    AX,CS
  280.     MOV    DS,AX
  281.     DISPLAY
  282.     POP    DS
  283.     RET    
  284.  
  285. RINGBELL:
  286.     MOV    DX,OFFSET [BELL]
  287.     CALL    PRTDX
  288.     RET    
  289.  
  290. BACK2:    
  291.     PUSH    AX
  292.     PUSH    BX
  293.     PUSH    DX
  294.     PUSH    SI
  295.     MOV    BH,0
  296.     MOV    AH,3    ; Get Cursor into DX
  297.     INT    10H
  298.     SUB    DL,2
  299.     MOV    AH,2    ; Set Cursor from DX
  300.     INT    10H
  301.     POP    SI
  302.     POP    DX
  303.     POP    BX
  304.     POP    AX
  305.     RET
  306.  
  307. GETANS:            ; Set DI to point to required ANS string
  308.     PUSH    ES
  309.     PUSH    SI
  310.     PUSH    BX
  311.     PUSH    CX
  312.     PUSH    DX
  313.     CLD
  314.     PUSH    CS
  315.     POP    ES
  316.     PUSH    DI
  317. G1:
  318.     POP    DI
  319.     PUSH    DI
  320.     MOV    AH,8
  321.     INT    21H
  322.     AND    AL,0DFH    ; Convert to Upper Case
  323.     MOV    CX,4
  324.     REPNZ    SCASB 
  325.     JNZ    G1
  326.     CMP    AL,0DH
  327.     JZ    G2
  328.     MOV    BH,0
  329.     MOV    CX,1
  330.     MOV    AH,0AH    ; Show Character
  331.     INT    10H
  332.     JMP    G1
  333. G2:
  334.     POP    DI
  335.     MOV    BH,0
  336.     MOV    AH,8    ; Get Character at Cursor
  337.     INT    10H
  338.     PUSH    AX
  339.     CALL    GETCURS
  340.     INC    DH
  341.     MOV    DL,2
  342.     CALL    SETCURS    ; to Next Line col 3
  343.     POP    AX
  344.     POP    DX
  345.     POP    CX
  346.     POP    BX
  347.     POP    SI
  348.     POP    ES
  349.     RET
  350.  
  351. GETCHARE:
  352.     MOV    AH,1
  353.     INT    21H
  354.     RET    
  355.  
  356. GETCHAR:
  357.     MOV    AH,8
  358.     INT    21H
  359.     RET    
  360.  
  361. GETCURS:
  362.     PUSH    CX
  363.     PUSH    AX
  364.     PUSH    BX
  365.     PUSH    SI
  366.     MOV    AH,3
  367.     MOV    BH,0
  368.     INT    10H
  369.     POP    SI
  370.     POP    BX
  371.     POP    AX
  372.     POP    CX
  373.     RET    
  374.  
  375. SETCURS:
  376.     PUSH    AX
  377.     PUSH    BX
  378.     PUSH    CX
  379.     PUSH    SI
  380.     MOV    AH,2
  381.     MOV    BH,0
  382.     INT    10H
  383.     POP    SI
  384.     POP    CX
  385.     POP    BX
  386.     POP    AX
  387.     RET    
  388.  
  389. GET_STATUS:
  390.     PUSH    AX
  391.     PUSH    DX
  392.     CALL    GET_PORT_OFFSET
  393.     IN    AL,DX
  394.     AND    AL,80H
  395.     CMP    AL,80H
  396.     POP    DX
  397.     POP    AX
  398.     RET    
  399.  
  400. GET_PORT_OFFSET:
  401.     PUSH    BX
  402.     MOV    BX,77H
  403.     MOV    BL,BYTE PTR [BX]
  404.     XOR    BH,BH
  405.     MOV    DX,322H
  406.     ADD    DX,BX
  407.     POP    BX
  408.     RET    
  409.  
  410. HEX2ASC:
  411.     push    bx
  412.     push    cx
  413.     push    dx
  414.     push    si
  415.     mov    bx,42H
  416.     mov    WORD PTR [bx],2020H
  417.     mov    WORD PTR [bx+02],2020H
  418.     mov    WORD PTR [bx+04],2020H
  419.     mov    bx,4
  420.     mov    cx,0AH
  421. CLRS1:
  422.     xor    dx,dx
  423.     div    cx
  424.     add    dl,30H      ;"0"
  425.     mov    si,42H
  426.     mov    [bx+si],dl
  427.     dec    bx
  428.     cmp    ax,0
  429.     jnz    CLRS1
  430.     pop    si
  431.     pop    dx
  432.     pop    cx
  433.     pop    bx
  434.     ret    
  435.  
  436. SET_STAT:
  437.     push    ax
  438.     push    dx
  439.     push    es
  440.     call    GET_PORT_OFFSET
  441.     in    al,dx
  442.     call    GET_STATUS
  443.     jc    STST
  444.     push    bx
  445.     mov    bx,43H
  446.     mov    ah,[bx]
  447.     pop    bx
  448.     and    ah,20
  449.     jz    STST
  450.     mov    cl,4
  451.     shr    al,cl
  452. STST:
  453.     mov    cl,4
  454.     and    al,7
  455.     shl    al,cl
  456.     xor    ah,ah
  457.     push    ax
  458.     push    ds
  459.     push    es
  460.     push    ax
  461.     mov    ax,0
  462.     mov    ds,ax
  463.     pop    ax
  464.     mov    bx,104H
  465.     push    ax
  466.     mov    ax,0
  467.     mov    es,ax
  468.     pop    ax
  469.     mov    bx,es:[bx]
  470.     pop    es
  471.     pop    ds
  472.     pop    ax
  473.     add    bx,ax
  474.     pop    es
  475.     pop    dx
  476.     pop    ax
  477.     ret    
  478.  
  479. SETBLANK:
  480.     mov    si,42H
  481.     mov    cx,5
  482. STB1:
  483.     mov    al,[si]
  484.     cmp    al,20H      ;" "
  485.     jnz    STB2
  486.     inc    si
  487.     dec    cx
  488.     jmp    STB1
  489. STB2:
  490.     ret    
  491.  
  492. SHOWNUM:
  493.     MOV    DL,[SI]
  494.     MOV    AH,2
  495.     INT    21H
  496.     INC    SI
  497.     LOOP    SHOWNUM
  498.     RET
  499.     
  500.  
  501. ;###
  502.  
  503. TIM_START:        ; Start Clock 
  504.     PUSH    AX
  505.     PUSH    DX
  506.     PUSH    DS
  507.     MOV    TIM_MICRO,0    ; Clear area for final results
  508.     MOV    TIM_MILLI,0    ;
  509.     MOV    TIM_SEC,0    ;
  510.     
  511.     ;Initialise counter 0 of 8253 chip
  512.      
  513.     MOV    AL,00110100B    ; Set mode for Counter 0
  514.     CLI
  515.     OUT    TIM_MODE,AL
  516.     SUB    AX,AX        ; Set Counter at Zero
  517.     OUT    TIM_0,AL    ; LSB
  518.     OUT    TIM_0,AL    ; MSB
  519.     MOV    DX,BIOS_DSEG    ; Read current setting of System Clock
  520.     MOV    DS,DX
  521.     MOV    AX,DS:[TIM_LOW]
  522.     STI
  523.     POP    DS
  524.     MOV    COUNT,AX    ; Save it
  525.     POP    DX        ; Restore Registers
  526.     POP    AX
  527.     RET
  528.  
  529. ; Elapsed timer since Timer start =
  530. ;    1) Timer count ticks @ 840 nSecs
  531. ;    2) Interrupt ticks @ 54 mSecs
  532.  
  533. TIM_STOP:        ; Stop Clock
  534.     PUSH    AX
  535.     PUSH    BX
  536.     PUSH    DX
  537.     MOV    AL,0        ; Ready to read 8253
  538.     CLI            ; Interrupts off until system clock read
  539.     OUT    TIM_MODE,AL    ; Set Mode for read
  540.     IN    AL,TIM_0    ; Read LSB
  541.     MOV    DL,AL        ; Save it
  542.     IN    AL,TIM_0    ; Read MSB
  543.     MOV    DH,AL        ; Save it
  544.     MOV    AX,COUNT_MAX
  545.     SUB    AX,DX        ; Timer Count Value
  546.     MUL    TIM_CONV    ; Make to tenths of a nanosecond
  547.     DIV    TEN_TH        ; Make to microseconds
  548.     MOV    TIM_MICRO,AX    ; Save it
  549.     CMP    DX,FIVE_TH    ; Round nanoseconds 
  550.     JB    CONT        ; Round down
  551.     INC    TIM_MICRO    ; Round up
  552. CONT:    MOV    DX,BIOS_DSEG
  553.     MOV    DS,DX
  554.     MOV    AX,DS:[TIM_LOW]    ; Collect System Clock reading
  555.     PUSH    CS
  556.     POP    DX        
  557.     MOV    DS,DX        ; Restore DS register
  558.     SUB    AX,COUNT    ; System ticks since start
  559.     MUL    COUNT_CONV    ; Make to thousandths of millisecond
  560.     DIV    THOU        ; Make to milliseconds
  561.     MOV    COUNT_MILLI,AX    ; Save millisecs
  562.     MOV    COUNT_MICRO,DX    ; Save microsecs
  563.     CMP    AX,0        ; Check for elapsed time less than 1 mSec
  564.     JNE    JIT        ; If not - no problem
  565.     MOV    AX,ADJUSTM    ; Compensation amount
  566.     CMP    TIM_MICRO,AX    ; Less than microseconds?
  567.     JAE    JIT        ; No - so OK
  568.     MOV    TIM_MICRO,AX    ; Yes so use compensation
  569.     
  570. JIT:    MOV    AX,DX        ; This is System Microsecs
  571.     ADD    AX,TIM_MICRO    ; Add Timer Microsecs
  572.     CMP    AX,ADJUSTM    ; any underflow?
  573.     JAE    COMP        ; No - so continue
  574.     DEC    COUNT_MILLI    ; Yes - so borrow
  575.     ADD    AX,1000    
  576. COMP:    SUB    AX,ADJUSTM    ; Apply compensation
  577.     MOV    TIM_MICRO,AX    
  578.     CMP    AX,1000        ; any overflow?
  579.     JB    FLDOK        ; No - so continue
  580.     SUB    DX,DX        ; TIM_MICRO too large!
  581.     DIV    THOU        ; so carry into TIM_MILLI
  582.     MOV    TIM_MILLI,AX
  583.     MOV    TIM_MICRO,DX
  584. FLDOK:    MOV    AX,COUNT_MILLI    ; Get System milliseconds
  585.     ADD    TIM_MILLI,AX    ; Add to timer milliseconds
  586.     CMP    TIM_MILLI,1000    ; any overflow
  587.     JB    QUIT        ; No - so continue
  588.     SUB    DX,DX        ; 
  589.     MOV    AX,TIM_MILLI    ; TIM_MILLI too large
  590.     DIV    THOU        ; so carry into TIM_SEC
  591.     MOV    TIM_SEC,AX    ; Save Seconds
  592.     MOV    TIM_MILLI,DX    ; Save Milliseconds
  593.  
  594. QUIT:    
  595.     POP    DX        ; Restore registers
  596.     POP    BX
  597.     POP    AX
  598.     RET
  599.  
  600. ;----------------------------------
  601. ;  Decode and Display Time readings
  602. ;----------------------------------    
  603. SHOW_AVE:
  604.     PUSH    AX
  605.     PUSH    BX
  606.     PUSH    DX
  607.     LEA    DX,MESS_AVE
  608.     JMP    SHOW0
  609. SHOW:
  610.     PUSH    AX        ; Save registers
  611.     PUSH    BX
  612.     PUSH    DX
  613.     LEA    DX,MESS_RUN    ; Display Seconds Message
  614. SHOW0:    CALL    PRTDX
  615.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  616.     MOV    AX,TIM_SEC    ; Get Value of Seconds
  617.     CALL    BIN2ASC        ; Convert from binary to ASCII
  618.     MOV    DX,BX        ; Transfer pointer
  619.     CALL    PRTDX            ; Display Seconds value
  620.     LEA    DX,MESS_MIL    ; Display Decimal point
  621.     CALL    PRTDX
  622.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  623.     MOV    AX,TIM_MILLI    ; Get Value of Milliseconds
  624.     CALL    BIN2ASC        ; Convert from binary to ASCII
  625.     LEA    DX,ASC_STR+2    ; Point to last three digits
  626.     CALL    PRTDX            ; Display Milliseconds Value
  627.     LEA    DX,MESS_MIC    ; Display comma
  628.     CALL    PRTDX
  629.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  630.     MOV    AX,TIM_MICRO    ; Get Value of Microseconds
  631.     CALL    BIN2ASC        ; Convert from binary to ASCII
  632.     LEA    DX,ASC_STR+2    ; Point to last three digits
  633.     CALL    PRTDX            ; Display Microseconds value
  634.     LEA    DX,MESS_SEC
  635.     CALL    PRTDX
  636.     POP    DX        ; Restore registers
  637.     POP    BX
  638.     POP    AX
  639.     RET
  640.  
  641. ;--------------------------------------------
  642. ;    Binary to ASCII conversion into ASC_STR
  643. ;--------------------------------------------
  644. ;    Value to be converted is passed in AX and written to ASC_STR
  645.  
  646. BIN2ASC:
  647.     PUSH    DX            ; Save registers
  648.     PUSH    CX
  649.     PUSH    AX
  650.     MOV    CX,5            ; Clear ASC_STR
  651. CLBUF:    MOV    BYTE PTR [BX],30H    ; Put zeroes in
  652.     INC    BX
  653.     LOOP    CLBUF
  654. CONV:    SUB    DX,DX            ; Clear upper half of dividend
  655.     DIV    TEN            ; = (DX:AX)/10
  656.     ADD    DX,30H            ; Convert to ASCII
  657.     DEC    BX            ; bump pointer
  658.     MOV    [BX],DL            ; Save digit
  659.     OR    AX,AX            ; Check if finished?
  660.     JNZ    CONV            ; No - go again!
  661.     POP    AX            ; Restore registers
  662.     POP    CX
  663.     POP    DX
  664.     RET
  665.  
  666. ;------------------------
  667. ;  CONVERT TIME TO ASCII
  668. ;-----------------------
  669.  
  670. TIM2ASC:
  671.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  672.     MOV    AX,TIM_SEC    ; Get Value of Seconds
  673.     CALL    BIN2ASC        ; Convert from binary to ASCII
  674.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  675.     MOV    AX,TIM_MILLI    ; Get Value of Milliseconds
  676.     CALL    BIN2ASC        ; Convert from binary to ASCII
  677.     LEA    BX,ASC_STR    ; Point to ASC_STR area
  678.     MOV    AX,TIM_MICRO    ; Get Value of Microseconds
  679.     CALL    BIN2ASC        ; Convert from binary to ASCII
  680.     RET
  681. ;------------------------
  682. ;  MAIN CODE    XXXXX
  683. ;------------------------    
  684.     
  685.  
  686. START:
  687.     MOV    AX,600H
  688.     MOV    CX,0
  689.     MOV    DX,184FH
  690.     MOV    BH,1FH
  691.     INT    10H
  692.     MOV    DX,0
  693.     CALL    SETCURS    
  694.     LEA    DX,SIGN_ON    ; Display Sign-on Message
  695.     CALL    PRTDX        ; Prints frame
  696.     MOV    AH,01
  697.     INT    21H
  698.     MOV    AX,600H
  699.     MOV    CX,0302H
  700.     MOV    DX,164DH
  701.     MOV    BH,1FH
  702.     INT    10H
  703.     
  704.     MOV    AX,40H
  705.     MOV    DS,AX
  706.     MOV    AX,0        ; Reset Fixed Drive 1
  707.     MOV    DX,0
  708.     MOV    DL,80H
  709.     MOV    CX,1
  710.     INT    13H
  711.     MOV    DX,0402H
  712.     CALL    SETCURS
  713.     MOV    AH,14H        ; Controller Diagnostics
  714.     MOV    DL,80H
  715.     INT    13H
  716.     JNC    START1
  717.     LEA    DX,DUFF_CONT    ; Controller Faulty
  718.     CALL    PRTDX
  719. QQQ:
  720.     LEA    DX,ABORT
  721.     CALL    PRTDX
  722.     MOV    AX,4C01H
  723.     INT    21H        ; END
  724. ;==========================  
  725. START1:
  726.  
  727.     PUSH    CS
  728.     POP    DS
  729.     CLI
  730.     CALL    TIM_START    ; Start the Clock
  731.     CALL    TIM_STOP    ; Stop the Clock
  732.     STI
  733.     MOV    DX,TIM_MICRO    ; Read elapsed time (overhead)
  734.     MOV    ADJUSTM,DX    ; Save as compensation factor
  735.  
  736.     LEA    DX,MESS_01    ; Show Warning Message
  737.     CALL    PRTDX
  738.     CALL    BACK2
  739.     LEA    DI,ANSYN
  740.     CALL    GETANS
  741.     CMP    AL,'Y'
  742.     JZ    DRSEL        ; Answer was 'Y'
  743.     JMP    QQQ
  744. DRSEL:        
  745.     MOV    AX,40H
  746.     MOV    DS,AX
  747.     MOV    BX,75H        ; How many H Disks?
  748.     CMP    BYTE PTR [BX],2 
  749.     JZ    DRSEL01        ; 2 Drives so Select
  750.     MOV    AL,0        ; 1 Drive so Jump
  751.     JMP    SRSEL03 
  752. DRSEL01:
  753.     CALL    GET_STATUS
  754.     JC    DRSEL02        ; Logical Partitioning Set Up
  755.     JMP    SRSEL01
  756. DRSEL02:
  757.     LEA    DX,LOG_PART
  758.     CALL    PRTDX
  759.     JMP    QQQ
  760.  
  761. SRSEL01:
  762.     LEA    DX,SELECT1
  763.     CALL    PRTDX
  764.     CALL    BACK2
  765.     LEA    DI,ANSCD
  766.     CALL    GETANS
  767.     CMP    AL,'C'
  768.     JZ    SRSEL02
  769.     MOV    AL,0
  770.     MOV    BYTE PTR CS:[DR_ID],81H
  771.     MOV    BYTE PTR CS:[MESS_OPT4],44H
  772.     JMP    SRSEL03
  773. SRSEL02:
  774.     MOV    AL,20H
  775. SRSEL03:
  776.     MOV    BX,43H
  777.     MOV    [BX],AL
  778.     call    GET_STATUS
  779.     jnc    DRREP1
  780.     mov    bx,43H
  781.     cmp    BYTE PTR [BX],60H
  782.     jz    DRREP1
  783.     JMP    DRSEL02
  784. DRREP1:
  785.     LEA    dx,DR_REPP
  786.     call    PRTDX
  787.     call    SET_STAT
  788.     MOV    AX,800H
  789.     MOV    DX,0
  790.     MOV    DL,BYTE PTR CS:[DR_ID]
  791.     INT    13H            ;CH=62H  CL=1 0010001
  792.     INC    DH
  793.     MOV    CS:[HDS],DH        ; Number of Heads
  794.     MOV    AX,CX
  795.     MOV    CX,6
  796.     SHR    AL,CL
  797.     XCHG    AH,AL
  798.     ADD    AX,2
  799.     MOV    CS:[CYLS],AX
  800.     PUSH    AX
  801.     LEA    DX,DR_CYL
  802.     CALL    PRTDX
  803.     POP    AX
  804.     CALL    HEX2ASC    
  805.     CALL    SETBLANK
  806.     CALL    SHOWNUM
  807.     LEA    DX,LF
  808.     CALL    PRTDX
  809.     LEA    DX,DR_HDS
  810.     CALL    PRTDX
  811.     SUB    AX,AX
  812.     MOV    AL,CS:[HDS]
  813.     CALL    HEX2ASC    
  814.     CALL    SETBLANK
  815.     CALL    SHOWNUM
  816.     CALL    GETCURS
  817.     INC    DH
  818.     INC    DH
  819.     MOV    DL,2
  820.     CALL    SETCURS
  821.     LEA    DX,CONFIRM
  822.     CALL    PRTDX
  823.     CALL    BACK2
  824.     LEA    DI,ANSYN
  825.     CALL    GETANS
  826.     CMP    AL,'Y'
  827.     JZ    FMTCMD0
  828.     JMP    QQQ
  829. FMTCMD0:
  830.     LEA    DX,MESS_OPT0
  831.     CALL    PRTDX
  832.  
  833. FMTCMD:
  834.     PUSH    CS
  835.     POP    DS
  836.     MOV    CX,2        ; Two Tracks to FORMAT
  837. FMTRAKS:
  838.     PUSH    CX        ; Save track count
  839.     MOV    AL,CL        ; Use it to mark Track
  840.     DEC    AL
  841.     MOV    CX,4        ; Four Heads to use
  842. FMTRAK:
  843.     PUSH    CX        ; Save Head Count
  844.     PUSH    AX        ; Save Track indicator
  845.     MOV    DH,CL        ; Set Head number
  846.     DEC    DH
  847.     MOV    CH,AL        ; CYL NO.
  848.     MOV    AH,05H        ; Format command
  849.     MOV    AL,BYTE PTR [INTERLEAVE]
  850.     MOV    BX,OFFSET DTABUF
  851.     MOV    CL,1        ; SECT=1
  852.     MOV    DL,BYTE PTR [DR_ID]    ; Drive
  853.     INT    13H
  854.     POP    AX
  855.     POP    CX
  856.     LOOP    FMTRAK
  857.     POP    CX
  858.     LOOP    FMTRAKS
  859.  
  860. ;--------------------------------------------------
  861. ; Each of the following loops sets the Disk Head to a position,
  862. ; Starts the clock, resets the Disk Head and then stops the clock.
  863. ; The subsequent time is then converted and displayed.
  864. ;--------------------------------------------------
  865. ; This runs the Disk test routine 8 times and places the
  866. ; successive results in TIM1 to TIM8 Data Words
  867. ;--------------------------------------------------
  868.  
  869.     IRP    ?X,<1,2,3,4>
  870.     HEADSET    0,0    
  871.     CLI
  872.     CALL    TIM_START
  873.     HEADSET    3,310
  874.     CALL    TIM_STOP
  875.     STI
  876.     CALL    TIM2ASC
  877.     MOV    SI,OFFSET TIM_MICRO
  878.     MOV    DI,OFFSET TIM&?X&MIC
  879.     MOV    CX,6
  880.     REP    MOVSB
  881.     ENDM
  882.  
  883. ;--------------------------------------------------
  884. ; Now we must average out the 8 test results obtained
  885. ; and put the answer back into TIM_MICRO +++
  886. ;--------------------------------------------------
  887.  
  888.     SUB    AX,AX            ; Clear AX for addition
  889.     
  890.     IRP    ?X,<1,2,3,4>
  891.     ADD    AX,DS:[TIM&?X&MIC]
  892.     ENDM
  893.  
  894.     MOV    TIM_MICRO,AX
  895. ;--------------------------------------------------
  896.  
  897.     SUB    AX,AX            ; Clear AX for addition
  898.     
  899.     IRP    ?X,<1,2,3,4>
  900.     ADD    AX,DS:[TIM&?X&MIL]
  901.     ENDM
  902.  
  903.     MOV    TIM_MILLI,AX
  904. ;--------------------------------------------------
  905.  
  906.     SUB    AX,AX            ; Clear AX for addition
  907.     
  908.     IRP    ?X,<1,2,3,4>
  909.     ADD    AX,DS:[TIM&?X&SEC]
  910.     ENDM
  911.  
  912.     MOV    DX,0
  913.     MUL    THOU
  914.     ADD    AX,[TIM_MILLI]
  915.     JNC    NEXT1
  916.     INC    DX
  917. NEXT1:
  918.     MUL    THOU
  919.     ADD    AX,[TIM_MICRO]
  920.     JNC    NEXT2
  921.     INC    DX
  922. NEXT2:
  923.     SHR    DX,1
  924.     RCR    AX,1
  925.     SHR    DX,1
  926.     RCR    AX,1
  927.             ; Now DX:AX contains binary number of Microsecs
  928.     DIV    THOU
  929.     MOV    [TIM_MICRO],DX
  930.     XOR    DX,DX
  931.     DIV    THOU
  932.     MOV    [TIM_MILLI],DX
  933.     MOV    [TIM_SEC],AX        
  934.  
  935.     CMP    [LOWSEC],AX
  936.     JC    LBL2
  937.     CMP    [LOWMIL],DX
  938.     JC    LBL2
  939.     MOV    [LOWMIL],DX
  940.     MOV    [LOWSEC],AX
  941.     MOV    AX,WORD PTR [INTERLEAVE]
  942.     MOV    WORD PTR [INTLVE],AX
  943. LBL2:    
  944.     MOV    AL,BYTE PTR [INTERLEAVE]
  945.     AAM
  946.     OR    AX,3030H
  947.     XCHG    AH,AL
  948.     MOV    WORD PTR [MESS_EQ],AX
  949.     CALL    GETCURS
  950.     PUSH    DX
  951.     LEA    DX,MESS_RUN    ; Display Seconds Message
  952.     CALL    PRTDX
  953.     CALL    SHOW_AVE        ; Display Average time
  954.     POP    DX
  955.     CALL    SETCURS
  956.     DEC    BYTE PTR [INTERLEAVE]
  957.     JZ    FINISH
  958.     JMP    FMTCMD
  959. FINISH:
  960.     CALL    GETCURS
  961.     MOV    DL,2
  962.     CALL    SETCURS
  963.     LEA    DX,BLANKLINE
  964.     CALL    PRTDX
  965.     CALL    GETCURS
  966.     MOV    DL,2
  967.     CALL    SETCURS
  968.     MOV    AL,BYTE PTR [INTLVE]
  969.     AAM
  970.     OR    AX,3030H
  971.     XCHG    AH,AL
  972.     MOV    WORD PTR [MESS_OPT2],AX
  973.     LEA    DX,MESS_OPT1        ; Display IntLve Message
  974.     CALL    PRTDX
  975.     CALL    GETCURS
  976.     INC    DH
  977.     MOV    DL,2
  978.     CALL    SETCURS
  979.     LEA    DX,MESS_OPT3
  980.     CALL    PRTDX
  981.     LEA    DX,MESS_OPT2
  982.     CALL    PRTDX    
  983.     MOV    AL,BYTE PTR [INTLVE]
  984.     MOV    DH,0
  985.     MOV    DL,BYTE PTR [DR_ID]
  986.     MOV    CX,1
  987.     MOV    AH,7
  988.     INT    13H        ; Drive Formatted HERE
  989.     CALL    GETCURS
  990.     MOV    DL,2
  991.     DEC    DH
  992.     CALL    SETCURS
  993.     LEA    DX,MESS_OPT9    ; Format Complete
  994.     CALL    PRTDX
  995. TEST:
  996.     LEA    DX,MESS_OPT5    ; Bad Tracks? N       Line 1
  997.     CALL    PRTDX
  998.     CALL    BACK2
  999.     LEA    DI,ANSYN
  1000.     CALL    GETANS
  1001.     CMP    AL,'Y'
  1002.     JZ    BAD_TRAKS00
  1003.     JMP    QQQ1
  1004.  
  1005. BAD_TRAKS00:
  1006.     CALL    GETCURS
  1007.     MOV    DL,2
  1008.     CALL    SETCURS
  1009.     LEA    DX,MESS_OPT6    ; Enter Track        Line 2
  1010.     CALL    PRTDX
  1011.     CALL    GETNUM    
  1012. ; TEST AX FOR VALID CYLINDER
  1013.     CMP    AX,WORD PTR CS:[CYLS]
  1014.     JC    CYLOK
  1015.     CALL    RINGBELL
  1016.     LEA    DX,BADCYL
  1017.     CALL    PRTDX
  1018.     CALL    GETCURS
  1019.     DEC    DH
  1020.     MOV    DL,2
  1021.     CALL    SETCURS
  1022.     LEA    DX,BLANKLINE
  1023.     CALL    PRTDX
  1024.     JMP    BAD_TRAKS00
  1025. CYLOK:    
  1026.     push    ax
  1027. CYLOK1:
  1028.     CALL    GETCURS
  1029.     INC    DH
  1030.     MOV    DL,2
  1031.     CALL    SETCURS
  1032.     LEA    DX,MESS_OPT7    ; Enter Head        Line 3
  1033.     CALL    PRTDX
  1034.     CALL    GETNUM
  1035. ; TEST AX FOR VALID HEAD NUMBER    
  1036.     CMP    AL,BYTE PTR CS:[HDS]
  1037.     JC    HDOK
  1038.     CALL    RINGBELL
  1039.     LEA    DX,BADHD
  1040.     CALL    PRTDX
  1041.     CALL    GETCURS
  1042.     DEC    DH
  1043.     MOV    DL,2
  1044.     CALL    SETCURS
  1045.     LEA    DX,BLANKLINE
  1046.     CALL    PRTDX
  1047.     CALL    GETCURS
  1048.     DEC    DH
  1049.     MOV    DL,2
  1050.     CALL    SETCURS
  1051.     JMP    CYLOK1
  1052. HDOK:
  1053. ; AX HAS HEAD NUMBER, STACK HAS CYLINDER NUMBER
  1054. ; FORMAT BAD TRACK
  1055.     POP    BX
  1056.     CALL    SET_BADTRAK
  1057.     CALL    GETCURS
  1058.     INC    DH
  1059.     MOV    DL,2
  1060.     CALL    SETCURS
  1061.     LEA    DX,MESS_OPT8    ; Track Flagged - MORE?   Line 4
  1062.     CALL    PRTDX
  1063.     CALL    BACK2
  1064.     LEA    DI,ANSYN
  1065.     CALL    GETANS
  1066.     CMP    AL,'Y'
  1067.     JZ    BAD_TRAKS01
  1068.     JMP    QQQ1
  1069.  
  1070. BAD_TRAKS01:
  1071.     CALL    GETCURS
  1072.     MOV    DL,2
  1073.     MOV    CX,5
  1074.  
  1075. BAD_TRAKS02:    
  1076.     PUSH    CX
  1077.     CALL    SETCURS
  1078.     LEA    DX,BLANKLINE
  1079.     CALL    PRTDX
  1080.     CALL    GETCURS
  1081.     DEC    DH
  1082.     MOV    DL,2
  1083.     POP    CX
  1084.     LOOP    BAD_TRAKS02
  1085.     CALL    GETCURS
  1086.     MOV    DL,2
  1087.     CALL    SETCURS
  1088.     LEA    DX,MESS_OPT10
  1089.     CALL    PRTDX
  1090.     JMP    BAD_TRAKS00
  1091. QQQ1:
  1092.     LEA    DX,CONTINUE
  1093.     CALL    PRTDX
  1094. ; set up variables in BOOT_TRAK buffer and DX before writing Partition Table
  1095.  
  1096.     DEC    CYLS
  1097.     DEC    CYLS
  1098.     MOV    AX,[CYLS]
  1099.     MOV    CX,6
  1100.     SHL    AH,CL
  1101.     OR    AH,11H
  1102.     XCHG    AH,AL
  1103.     MOV    [XSECTS],AX    
  1104.     INC    CYLS
  1105.     MOV    AL,44H
  1106.     CBW
  1107.     MUL    CYLS
  1108.     SUB    AX,11H
  1109.     MOV    XSEC_END,AX
  1110.     MOV    AX,301H
  1111.     MOV    BX,OFFSET BOOT_TRAK
  1112.     MOV    DX,0
  1113.     MOV    DL,BYTE PTR [DR_ID]
  1114.     MOV    CX,1
  1115.     INT    13H
  1116.  
  1117.     MOV    AX,40H
  1118.     MOV    DS,AX
  1119.     INT    19H        ; Terminate program and Reboot
  1120.  
  1121. BOOT_TRAK:
  1122.     DB    0EBH,74H,90H,49H,6EH,76H,61H,6CH,69H,64H
  1123.     DB    20H,70H,61H,72H,74H,69H,74H,69H,6FH,6EH
  1124.     DB    20H,74H,61H,62H,6CH,65H,20H,6FH,6EH,20H
  1125.     DB    66H,69H,78H,65H,64H,20H,64H,69H,73H,6BH
  1126.     DB    0DH,0AH,00H,4EH,6FH,20H,6FH,70H,65H,72H
  1127.     DB    61H,74H,69H,6EH,67H,20H,73H,79H,73H,74H
  1128.     DB    65H,6DH,20H,6FH,6EH,20H,66H,69H,78H,65H
  1129.     DB    64H,20H,64H,69H,73H,6BH,0DH,0AH,00H,45H
  1130.     DB    72H,72H,6FH,72H,20H,6CH,6FH,61H,64H,69H
  1131.     DB    6EH,67H,20H,73H,79H,73H,74H,65H,6DH,20H
  1132.     DB    66H,72H,6FH,6DH,20H,66H,69H,78H,65H,64H
  1133.     DB    20H,64H,69H,73H,6BH,0DH,0AH,00H,0FAH,0FCH
  1134.     DB    33H,0C0H,8EH,0D8H,8EH,0C0H,8EH,0D0H,0BCH,00H
  1135.     DB    7CH,0BEH,00H,7CH,0BFH,00H,7EH,0B9H,00H,02H
  1136.     DB    0F3H,0A4H,0B8H,0E0H,07H,50H,0B8H,97H,00H,50H
  1137.     DB    0CBH,0FBH,0BFH,03H,00H,0BBH,0BEH,7FH,0B9H,04H
  1138.     DB    00H,2BH,0F6H,80H,3FH,00H,74H,0BH,80H,3FH
  1139.     DB    80H,75H,12H,0BH,0F6H,75H,0EH,8BH,0F3H,83H
  1140.     DB    0C3H,10H,0E2H,0EBH,0BFH,2BH,00H,0BH,0F6H,75H
  1141.     DB    03H,0EBH,2BH,90H,8BH,14H,8BH,4CH,02H,0BBH
  1142.     DB    00H,7CH,0BDH,03H,00H,0B0H,01H,0B4H,02H,0CDH
  1143.     DB    13H,73H,09H,4DH,75H,0F5H,0BFH,4FH,00H,0EBH
  1144.     DB    0FH,90H,0BFH,2BH,00H,81H,0BFH,0FEH,01H,55H
  1145.     DB    0AAH,75H,03H,1EH,53H,0CBH,2EH,8AH,05H,47H
  1146.     DB    3CH,00H,74H,09H,0BBH,07H,00H,0B4H,0EH,0CDH
  1147.     DB    10H,0EBH,0EFH,0EBH,0FEH
  1148.     DB    239 DUP (0)
  1149.     DB    80H,01H,01H,00H,04H,03H
  1150.  
  1151. XSECTS        DW    6291H
  1152.         DB    11H,00H,00H,00H
  1153. XSEC_END    DW    0A23BH
  1154.         DB    00H,00H,55H,0AAH
  1155.     
  1156. DTABUF    DW    4 DUP (?)
  1157.  
  1158.  
  1159.  
  1160. MAIN    ENDP
  1161. CODE    ENDS
  1162. END    BEGIN
  1163.             
  1164.         
  1165.  
  1166.